Spring AOP和AspectJ学习实践
使用Spring AOP
Spring AOP需要的依赖:
1 | <dependency> |
Spring中定义切面的方法,就是在配置文件中声明pointcut,以及pointcut对应的advice(有before,after等),如下:
1 | <aop:config> |
Pointcut定义的是切点,pointcut表明针对哪些方法需要AOP,然后基于AOP可以定义切点之前,之后,返回值,剖出异常时调用的方法,其实就是代理模式和装饰模式。
Spring + aspectj
AspectJ比Spring AOP更加强大,是运行时织入(weave)。需要的依赖有:
1 | <dependency> |
使用aspectj例子如下:
1 |
|
可以看到Around annotation注解使用的场景是在 Before annotation执行之前(进入方法之前)执行,然后 ProceedingPonintcut.proceed()执行完之后做一些统计处理,方法返回,然后执行After annotation。
对Spring MVC Controller进行AOP
如何对Spring MVC Controller进行AOP呢?见网上说:对于Spring MVC Controller实行AOP不能一般处理,因为Controller中的方法映射处理,其实都交给了AnnotationMethodHandlerAdapter.handle(),所以要针对其定义pointcut。然而并没有用!(亲测, 如下)而且AnnotationMethodHandlerAdapter现在Deprecated,as of Spring 3.2, in favor of RequestMappingHandlerAdapter
。
这样不行:
1 | "execution(* org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(..))") ( |
所以如果有这样的场景的话,可以使用Spring的HandlerInterceptor,参见。
遇到的问题
1 | Caused by: org.xml.sax.SAXParseException; lineNumber: 42; columnNumber: 29; cvc-complex-type.2.4.c: ?????????, ??????? 'aop:aspectj-autoproxy' ???? |
原因在xml配置文件中没有写完整,少了http://www.springframework.org/schema/aop/spring-aop.xsd
。